home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / asm / utils / echo / echo.asm < prev   
Assembly Source File  |  1980-01-03  |  11KB  |  353 lines

  1. ;link +
  2. ;
  3. ; -Title:
  4. ;   Echo v1.01
  5. ;
  6. ; -Purpose:
  7. ;   To Echo
  8. ;
  9. ; -Author:
  10. ;   Tomi Marin, Supervisor Software
  11. ;
  12. ; -Copyright:
  13. ;   Copyright © 1989 by Supervisor Software
  14. ;
  15. ; -Bugs:
  16. ;   
  17. ;
  18. ; -Usage:
  19. ;   ECH [b#] [p#] [r] [v#d] [v#i]
  20. ;
  21. ; -Modification history:
  22. ;   17.09.89 by TM -> v0.00      - created
  23. ;   19.09.89 by TM -> v1.00      - a working version
  24. ;   21.09.89 by JM,TM -> v1.00.1  - kommentoitu suomeksi
  25. ;   23.09.89 by JM -> v1.01       - small modifications
  26. ;
  27.  
  28.  
  29.     include    "relative.i"
  30.     include    "jmplibs.i"
  31.     include    "gfxlib.i"
  32.     include    "execlib.i"
  33.     include    "doslib.i"
  34.     include    "strlib.i"
  35.     include    "mathlib.i"
  36.     include    "numlib.i"
  37.     include    "macros.i"
  38.     include    "util.i"
  39.     include    "hards.i"
  40.     include    "constants.i"
  41.     include    "dos.xref"
  42.     include    "exec.xref"
  43.  
  44.  
  45. RELATIVE set    -1            käytetään suhteellista osoitusta
  46. BUF    equ    5000            viivepuskurin oletuspituus
  47. PER    equ    200            näytteenottotaajuuden oletusarvo
  48. VOL    equ    64            voimakkuuden oletusarvo
  49.  
  50.     .var
  51.     dl    _DosBase,cmdlin        varataan muuttujille tilaa pinosta
  52.     dl    exitcode,buflen,buffer
  53.     dl    tables,tablea
  54.     dw    periot,repeti,vola,volb
  55.  
  56. main    .begin                itse tilan varaus (LINK-käsky)
  57.     ra                nollataan muuttujat
  58.     clr.b    -1(a0,d0.l)        lisätään nolla komentorivin loppuun
  59.     move.l    a0,cmdlin(a4)        talletetaan komentorivin osoitin
  60.     moveq    #20,d0
  61.     move.l    d0,exitcode(a4)        asetetaan virhekoodi
  62.  
  63.     openlib    Dos,clean        avataan Dos-kirjasto
  64.  
  65.     move.l    #512,d0            varataan 512 tavua muistia
  66.     moveq    #1,d1
  67.     lib    Exec,AllocMem
  68.     move.l    d0,tables(a4)        muistin alkuosoite talteen
  69.     beq    clean            jos muistia ei saatu, poistutaan
  70.  
  71.     move.l    tables(a4),a0        kopioidaan alkuosoite
  72.     move.l    a0,tablea(a4)
  73.  
  74.     move.l    #BUF,buflen(a4)        puskurin pituuden oletusarvo
  75.     move.w    #PER,periot(a4)        näytteenottotaajuuden oletusarvo
  76.     moveq    #VOL,d0            äänenvoimakkuuden oletusarvo
  77.     move.w    d0,vola(a4)
  78.     move.w    d0,volb(a4)
  79.     move.l    cmdlin(a4),a0        otetaan komentorivin osoite
  80. parse1    move.b    (a0)+,d0        merkki komentoriviltä
  81.     beq    parse0            nolla -> rivin loppu -> pois
  82.     cmp.b    #32,d0            jos välilyönti,
  83.     beq.s    parse1             otetaan seuraava merkki
  84.     cmp.b    #9,d0            jos tabulaattori,
  85.     beq.s    parse1             otetaan seuraava merkki
  86.  
  87.     cmp.b    #'b',d0            onko 'b' (puskurin koko)?
  88.     bne.s    parse2            ei -> hyppää
  89.     bsr    get10            otetaan 10-järjestelmän luku
  90.     bcs    badargs            rivi loppui -> virheilmoitus
  91.     move.l    d0,buflen(a4)        talletetaan puskurin koko
  92.     bra    parse1            jatketaan rivin käsittelyä
  93.  
  94. parse2    cmp.b    #'p',d0            onko 'p' (näytt.ottonop.)?
  95.     bne.s    parse3            ei -> hyppää
  96.     bsr    get10            otetaan 10-järjestelmän luku
  97.     bcs    badargs            rivi loppui -> virheilmoitus
  98.     move.w    d0,periot(a4)        talletetaan nopeus
  99.     bra    parse1            jatketaan rivin käsittelyä
  100.  
  101. parse3    cmp.b    #'r',d0            onko 'r' (toistuva kaiku)?
  102.     bne.s    parse4            ei -> hyppää
  103.     st    repeti(a4)        asetetaan lippu: toistuva
  104.     bra    parse1            jatketaan rivin käsittelyä
  105.  
  106. parse4    cmp.b    #'v',d0            onko 'v' (voimakkuus)?
  107.     bne.s    parse5            ei -> hyppää
  108.     bsr    get10            otetaan 10-järjestelmän luku
  109.     bcs    badargs            rivi loppui -> virheilmoitus
  110.     move.b    (a0)+,d1        seuraava merkki (pitäisi olla d tai i)
  111.     cmp.b    #'d',d1            onkos 'd'?
  112.     bne.s    1$            eipä ole -> hyppele!
  113.     move.w    d0,vola(a4)        on -> tallenna suoran äänen voim.
  114.     bra    parse1            jatka rivin käsittelyä
  115. 1$    cmp.b    #'i',d1            onkos se sitten 'i'?
  116.     bne.s    2$            ei -> hyppää taas
  117.     move.w    d0,volb(a4)        on -> tallenna viivästetyn äänen voim.
  118.     bra    parse1            jatka rivin käsittelyä
  119. 2$    lea    3$(pc),a0        virheilmoituksen osoite a0:aan
  120.     bsr    dpymsg            tulostetaan virheilmoitus
  121.     bra    clean            pois ohjelmasta!
  122. 3$    dc.b    'use vNNd / vNNi',LF,0
  123.     ds.w    0            tasataan parilliseen osoitteeseen
  124.  
  125. parse5    lea    1$(pc),a0        virheilmoituksen osoite
  126.     bsr    dpymsg            tulostetaan se
  127.     bra    clean             ja poistutaan koko roskasta
  128. 1$    dc.b    'Bad option "%lc"',LF,0
  129.     ds.w    0            tasataan taas parilliseen osoitteeseen
  130.  
  131. parse0    move.l    buflen(a4),d0        puskurin koko
  132.     move.l    #MEMF_CLEAR!MEMF_PUBLIC,d1
  133.     lib    Exec,AllocMem        varataan kaikupuskuri
  134.     move.l    d0,buffer(a4)        tallennetaan alkuosoite
  135.     bne.s    main1            jos muistia saatiin -> main1
  136.  
  137.     move.l    buflen(a4),d0        jos ei saatu, valitetaan:
  138.     lea    1$(pc),a0        virheilmoituksen osoite
  139.     bsr    dpymsg            tulostetaan
  140.     bra    clean            ja pian pois täältä!
  141. 1$    dc.b    'Can''t get %ld bytes.',LF,0
  142.     ds.w    0            ja taas tasataan
  143.  
  144. main1    move.l    tablea(a4),a0        aputaulukon osoite
  145.     moveq    #0,d0
  146. 1$    move.w    d0,d1            lasketaan taulukkoon luvut
  147.     mulu.w    #$101,d1         $0000, $0101, $0202,...$ffff
  148.     move.w    d1,(a0)+        luku talteen
  149.     addq.w    #1,d0            seuraava nummero
  150.     cmp.w    #$100,d0        jokos lopetetaan?
  151.     blo.s    1$            ei -> hyppää
  152.  
  153.     lib    Exec,Disable        Nyt loppui moniajo!!
  154.     clr.b    $bfe301            rinnakkaisportti sisäänmenoksi
  155.     lea    $dff000,a6        apuprosessorien osoite
  156.     move.w    vola(a4),AUD0VOL(a6)    kanavan 0 voimakkuus
  157.     move.w    vola(a4),AUD1VOL(a6)    kanavan 1 voimakkuus
  158.     move.w    volb(a4),AUD2VOL(a6)    kanavan 2 voimakkuus
  159.     move.w    volb(a4),AUD3VOL(a6)    kanavan 3 voimakkuus
  160.     move.w    periot(a4),d0
  161.     move.w    d0,AUD0PER(a6)        kanavan 0 toistonopeus
  162.     move.w    d0,AUD1PER(a6)        kanavan 1 toistonopeus
  163.     move.w    d0,AUD2PER(a6)        kanavan 2 toistonopeus
  164.     move.w    d0,AUD3PER(a6)        kanavan 3 toistonopeus
  165.  
  166.     move.w    #%1000000000001111,DMACON(a6)    DMA päälle
  167.     move.w    #%0000000000001111,DMACON(a6)    DMA pois
  168.     move.w    #%0000011110000000,INTENA(a6)    äänikesk. pois
  169.  
  170.     move.l    buffer(a4),a2        kaikupuskurin osoite
  171.     move.l    a2,a0            a0 = luku-kirjoitusosoitin
  172.     move.l    a2,d6            d6 = kaikupuskurin alkuosoite
  173.     move.l    a2,d7
  174.     add.l    buflen(a4),d7        d7 = kaikupuskurin loppuosoite
  175.     lea    $bfe101,a2        a2 = rinnakkaisportin osoite
  176.     move.l    tablea(a4),a3        a3 = aputaulukon osoite
  177.     tst.w    repeti(a4)        toistuva kaiku valittu?
  178.     beq.s    main3            ei, hyppää main3:een
  179.  
  180. main2    move.w    INTREQR(a6),d0        joko entinen näyte on soinut?
  181.     and.w    #%0000000010000000,d0    vahditaan kanavaa 0
  182.     beq.s    main2b            hyppää, jos pitää odottaa vielä
  183.     move.w    #$f0f,COLOR0(a6)    muuten väläyttää näytön taustaa
  184.     bra.s    main2c             ja jatkaa kiireesti
  185. main2b    move.w    INTREQR(a6),d0        varsinainen odotussilmukka
  186.     and.w    #%0000000010000000,d0
  187.     beq.s    main2b
  188.  
  189. main2c    move.w    #%0000011110000000,INTREQ(a6)    nollataan keskeytys
  190.     moveq    #0,d2
  191.     move.b    (a2),d0            otetaan digitoijalta näyte
  192.     sub.b    #$80,d0            muunnetaan välille -128...+127
  193.     move.b    d0,d2            kopio talteen
  194.     add.w    d2,d2            kerrotaan 2:lla
  195.     move.w    0(a3,d2.w),d2
  196.     move.w    d2,AUD0DAT(a6)        Paulalle näyte 16-bittisenä
  197.     move.w    d2,AUD1DAT(a6)
  198.     moveq    #0,d1
  199.     move.b    (a0),d1            otetaan viivästetty näyte puskurista
  200.     ext.w    d0            muunnetaan uusi ja vanha
  201.     ext.w    d1             16-bittisiksi
  202.     add.w    d1,d0             ja lasketaan ne yhteen
  203.     muls    #11,d0            kerrotaan tulos 11:lla
  204.     asr.w    #4,d0             ja jaetaan 16:lla
  205.     move.b    d0,(a0)+         sekä talletetaan puskuriin
  206.     and.w    #$ff,d0
  207.     add.w    d0,d0            kerrotaan 2:lla
  208.     move.w    0(a3,d0.w),d2
  209.     move.w    d2,AUD2DAT(a6)        ja annetaan Paulalle 16-bittisenä
  210.     move.w    d2,AUD3DAT(a6)
  211.     cmp.l    d7,a0            puskurin loppuosoite?
  212.     blo.s    1$            ei -> hyppää
  213.     move.l    d6,a0            on -> siirrytään takaisin alkuun
  214. 1$    btst    #6,-$100(a2)        vasen hiiren nappi?
  215.     bne.s    main2            ei oo -> jatkuu!
  216.     bra.s    exitti            on -> männään pois!
  217.  
  218.  
  219. main3    move.w    INTREQR(a6),d0        onko entinen näyte jo soinut?
  220.     and.w    #%0000000010000000,d0
  221.     beq.s    main3b            ei, ->
  222.     move.w    #$f0f,COLOR0(a6)    on, näytön tausta sinipunaiseksi
  223.     bra.s    main3c             ja jatka
  224. main3b    move.w    INTREQR(a6),d0        odota näytteen loppua
  225.     and.w    #%0000000010000000,d0
  226.     beq.s    main3b
  227.  
  228. main3c    move.w    #%0000011110000000,INTREQ(a6)    nollataan keskeytys
  229.     moveq    #0,d2
  230.     move.b    (a2),d0            lue uusi näyte digitoijalta
  231.     sub.b    #$80,d0            muunnetaan välille -128..127
  232.     move.b    d0,d2
  233.     add.w    d2,d2            taulukon indeksi
  234.     move.w    0(a3,d2.w),d2
  235.     move.w    d2,AUD0DAT(a6)        lue taulukosta ja soita näyte
  236.     move.w    d2,AUD1DAT(a6)
  237.     moveq    #0,d1
  238.     move.b    (a0),d1            lue entinen (kaiutettava) näyte
  239.     move.b    d0,(a0)+        korvaa se uudella puskuriin
  240.     add.w    d1,d1
  241.     move.w    0(a3,d1.w),d2        lue taulukosta ja kaiuta
  242.     move.w    d2,AUD2DAT(a6)
  243.     move.w    d2,AUD3DAT(a6)
  244.     cmp.l    d7,a0            puskurin loppu?
  245.     blo.s    1$
  246.     move.l    d6,a0            on: takaisin puskurin alkuun
  247. 1$    btst    #6,-$100(a2)        vasen hiiren nappi?
  248.     bne.s    main3            ei: jatketaan
  249.  
  250. exitti    lib    Exec,Enable        salli keskeytykset ja moniajo
  251.  
  252.     clr.l    exitcode(a4)        nollaa virhekoodi: ei virhettä
  253. clean    move.l    buffer(a4),d0        puskuri varattu?
  254.     beq.s    clean1
  255.     move.l    d0,a1            on: vapauta se
  256.     move.l    buflen(a4),d0
  257.     lib    Exec,FreeMem
  258. clean1    move.l    tables(a4),d0        taulukko varattu?
  259.     beq.s    clean2
  260.     move.l    d0,a1            on: vapauta
  261.     move.l    #512,d0
  262.     lib    Exec,FreeMem
  263. clean2    closlib    Dos            sulje Dos
  264.     move.l    exitcode(a4),d0        palauta mahdollinen virhekoodi
  265.     .end                pois
  266.  
  267.     ;    ilmoita 'Bad arguments' ja poistu:
  268. badargs    lea    1$(pc),a0        tekstin osoite
  269.     bsr.s    dpymsg            tulosta
  270.     bra.s    clean
  271. 1$    dc.b    'Bad args',LF,0
  272.     ds.w    0
  273.  
  274.     ;    tulosta muotoiltu viesti:
  275.     ;    a0 = muotoilumerkkijono, d0..d7 = mahd. parametrit
  276. dpymsg    movem.l    d0-d7/a0-a6,-(sp)    tallenna rekisterit
  277.     move.l    #256,d0
  278.     moveq    #1,d1
  279.     lib    Exec,AllocMem        varaa 256 tavua puskuria
  280.     tst.l    d0            saatiinko varattua?
  281.     beq.s    dpymsg0            ei: poistu
  282.     move.l    d0,a1
  283.     move.l    d0,a2
  284.     movem.l    (sp),d0-d1        palauta d0:n ja d1:n arvot
  285.     move.l    32(sp),a0        ja a0:n arvo
  286.     bsr.s    sformat            muotoile merkkijono puskuriin
  287.     lib    Dos,Output        minne tulostetaan?
  288.     move.l    d0,d1
  289.     beq.s    dpymsg1            ei minnekään: poistu
  290.     move.l    a2,a0
  291.     move.l    a0,d2
  292. 1$    tst.b    (a0)+            etsi merkkijonon loppu
  293.     bne.s    1$
  294.     subq.w    #1,a0            siirry takaisin nollan yli
  295.     move.l    a0,d3
  296.     sub.l    d2,d3            vähennä siitä alkuos. -> pituus
  297.     flib    Dos,Write        tulosta merkkijono
  298. dpymsg1    move.l    a2,a1
  299.     move.l    #256,d0
  300.     lib    Exec,FreeMem        vapauta puskuri
  301. dpymsg0    movem.l    (sp)+,d0-d7/a0-a6    palauta rekisterit
  302.     rts
  303.  
  304.     ;    muotoile merkkijono:
  305.     ;    a0 = muotoilumerkkijono, a1 = puskuri
  306.     ;    d0..d7 = mahd. parametrit
  307. sformat    push    a2-a3/a6/d0-d1
  308.     lea    -32(sp),sp        varaa 32 tavua pinosta
  309.     move.l    a1,a3            a3 = puskurin osoite
  310.     move.l    sp,a1            a1 = parametrien osoite
  311.     movem.l    d0-d7,(a1)        kirjoita parametrit sinne
  312.     lea    1$(pc),a2        a2 = merkki puskuriin -rutiini
  313.     lib    Exec,RawDoFmt        muotoile!
  314.     lea.l    -1(a3),a1        palauta loppunolla osoite a1:ssä
  315.     move.l    a1,a0            ja a0:ssa
  316.     lea    32(sp),sp        vapauta pinomuisti
  317.     pull    a2-a3/a6/d0-d1
  318.     rts
  319.     ;    edellisen rutiini merkin kirjoittamiseksi puskuriin:
  320.     ;    a3 = osoitin puskuriin
  321.     ;    d0 = merkki
  322. 1$    move.b    d0,(a3)+        kirjoita merkki ja suurenna
  323.     rts                osoitinta
  324.  
  325.     ;    lue 10-järjestelmän luku merkkijonosta:
  326.     ;    a0 = merkkijono
  327. get10    move.b    (a0),d0            ota merkki
  328.     bne.s    get10a            merkkijonon loppu -> virhe
  329. get10x    setc                c = 1: virhe
  330.     rts
  331. get10a    push    d1            ei:
  332.     moveq    #0,d1            nollaa luku
  333. get10b    moveq    #0,d0
  334.     move.b    (a0)+,d0        ota seur. merkki
  335.     sub.b    #'0',d0
  336.     blo.s    get10z            pienempi kuin '0' ->
  337.     cmp.b    #10,d0
  338.     bhs.s    get10z            suurempi kuin '9' ->
  339.     add.l    d1,d1            kerro jo saatu luku 10:llä
  340.     add.l    d1,d0            ja lisää uusi numero
  341.     asl.l    #2,d1
  342.     add.l    d0,d1
  343.     bra.s    get10b            ota seur. numero
  344. get10z    subq.w    #1,a0            siirry takaisin tunnistamatto-
  345.     move.l    d1,d0            maan merkkin; tulos d1:een
  346.     pull    d1            c = 0: ei virhettä
  347.     rts
  348.  
  349.  
  350.     libnames            käytetyt kirjastonimet
  351.     end
  352.  
  353.